class Observer {
  constructor(data) {
    this.observer(data)
  }

  observer(data) {
    //将data数据原有属性改成set和get的形式，如果data不为对象，则直接返回
    if (!data || typeof data !== 'object') {
      return
    }
    Object.keys(data).forEach(key => {
      // 数据劫持--数据绑定
      this.defineReactive(data, key, data[key])
      this.observer(data[key]) // 递归
    })
  }

  defineReactive(obj, key, value) {
    let dep = new Dep()
    Object.defineProperty(obj, key, {
      enumerable: true,
      configurable: true,
      get() {
        if (Dep.target) {
          dep.addSub(Dep.target)
        }
        return value
      },
      set(newValue) {
        if (value !== newValue) {
          console.log('我是值变化了', newValue)
          value = newValue
          dep.notify()
        }
      }
    })
  }
}

class Dep {
  constructor() {
    // 订阅的数组
    this.subs = []
  }
  // 保存观察者
  addSub(sub) {
    this.subs.push(sub)
  }
  // 广播
  notify() {
    this.subs.forEach(function (sub) {
      sub.update()
    })
  }
}